package com.ruoyi.common.utils;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.function.*;
import com.ruoyi.common.utils.sql.SqlUtil;

import java.util.List;
import java.util.stream.Collectors;

public class PageSizeUtils {


    /**
     * @Description: 设置业务数据（先Redis缓存查询）
     * @Param: getRedisExec 获取Redis缓存的执行函数
     * @Param: setRedisExec 设置Redis缓存的执行函数
     * @Param: listExec 获取分页列表的执行函数
     * @Param: totalExec 获取分页列表总数的执行函数
     * @Param: model 原方法中的入参
     * @Param: prefix Redis的key的前缀
     * @Return: T 返回的泛型
     */
    public static TableDataInfo setPageData(GetRedisDataFun getRedisExec, SetRedisDataFun setRedisExec, ListDataFun listExec, TotalDataFun totalExec, byte[] lock) throws BaseException {
        TableDataInfo t = null;

        /** 获取redis中的缓存信息 **/
        t = (TableDataInfo) getRedisExec.exec();
        if (VerifyUtil.isEmpty(t)) {
            /*** 线程同步，防止并发穿透 ***/
            synchronized (lock) {

                /** 获取redis中的缓存信息 **/
                t = (TableDataInfo) getRedisExec.exec();
                if (VerifyUtil.isEmpty(t)) {

                    t = setPageData(listExec, totalExec);


                    /** 保存信息入redis **/
                    if (!VerifyUtil.isEmpty(t)) {
                        setRedisExec.exec(t);
                    }
                }
            }
        }

        return t;
    }

//    /**
//     * @Description: 设置业务数据（先Redis缓存查询）
//     * @Param: getRedisExec 获取Redis缓存的执行函数
//     * @Param: setRedisExec 设置Redis缓存的执行函数
//     * @Param: listExec 获取分页列表的执行函数
//     * @Param: totalExec 获取分页列表总数的执行函数
//     * @Param: orListExec 其他业务处理的执行函数
//     * @Param: model 原方法中的入参
//     * @Param: prefix Redis的key的前缀
//     * @Return: T 返回的泛型
//     */
//    public static TableDataInfo setPageData(GetRedisDataFun getRedisExec, SetRedisDataFun setRedisExec, ListDataFun listExec, TotalDataFun totalExec, OrListDataFun orListExec, byte[] lock) throws BaseException {
//        TableDataInfo t = null;
//
//        /** 获取redis中的缓存信息 **/
//        t = (TableDataInfo) getRedisExec.exec();
//        if (VerifyUtil.isEmpty(t)) {
//            /*** 线程同步，防止并发穿透 ***/
//            synchronized (lock) {
//
//                /** 获取redis中的缓存信息 **/
//                t = (TableDataInfo) getRedisExec.exec();
//                if (VerifyUtil.isEmpty(t)) {
//
//
//
//                    t = setPageData(listExec, totalExec,orListExec);
//
//
//                    /** 保存信息入redis **/
//                    if (!VerifyUtil.isEmpty(t)) {
//                        setRedisExec.exec(t);
//                    }
//                }
//            }
//        }
//
//        return t;
//    }

    public static TableDataInfo setPageData(GetRedisDataFun getRedisExec, SetRedisDataFun setRedisExec, ListDataFun listExec, byte[] lock) throws BaseException {
        return setPageData(getRedisExec, setRedisExec, listExec, null, lock);
    }


    public static TableDataInfo setPageData(ListDataFun listExec, TotalDataFun totalExec) {
        TableDataInfo tableDataInfo = null;
        List list = listExec.exec();
        if(StringUtils.isEmpty(list)){
            tableDataInfo = new TableDataInfo();
            tableDataInfo.setCode(HttpStatus.ERROR);
            tableDataInfo.setMsg("查询失败");
        }

        if (totalExec == null) {
            tableDataInfo = new TableDataInfo(list, list.size());
            tableDataInfo.setTotal(new PageInfo(list).getTotal());
        } else {
            tableDataInfo = new TableDataInfo(list, totalExec.exec());
        }
        tableDataInfo.setCode(HttpStatus.SUCCESS);
        tableDataInfo.setMsg("查询成功");


        return tableDataInfo;
    }

//    public static TableDataInfo setPageData(ListDataFun listExec, TotalDataFun totalExec,OrListDataFun orListExec) {
//        TableDataInfo tableDataInfo = null;
//        List temp_list = listExec.exec();
//        List list = orListExec.exec(temp_list);
//
//        if (totalExec == null) {
//            tableDataInfo = new TableDataInfo(list, temp_list.size());
//            tableDataInfo.setTotal(new PageInfo(temp_list).getTotal());
//        } else {
//            tableDataInfo = new TableDataInfo(list, totalExec.exec());
//        }
//        tableDataInfo.setCode(HttpStatus.SUCCESS);
//        tableDataInfo.setMsg("查询成功");
//
//
//        return tableDataInfo;
//    }
    /**
     * 请求分页数据rediskey
     */
    public static String getRedisKey() {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
            String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
            Boolean reasonable = pageDomain.getReasonable();
            if (reasonable && pageNum > 0) {
                return pageNum + "_" + pageSize + "_" + orderBy;
            }
        }
        return null;
    }

    /**
     * 对数组进行分页
     */
    public static <T> List<T> pageList(List<T> list,Integer pn,Integer ps){
        if(pn==null || ps==null || pn<=0 || ps<=0) {pn=1;ps=10;}
        return  list.stream().skip((pn-1)*ps).limit(ps).collect(Collectors.toList());
    }


    /*
     * 返回分页sql
     * */

    public static String getPageLimit (Integer currPage,Integer PageSize){
        if(currPage==null) {currPage=1;}
        if(PageSize==null) {PageSize=10;}
        Integer first = (currPage - 1) *PageSize;
        return "limit "+String.valueOf(first)+","+String.valueOf(PageSize);
    }

}


